package com.time.auth.common.exception;

import java.io.Serial;
import java.io.Serializable;

/**
 * 鉴权模块基础异常类
 *
 * @author: HuangQi
 * @date: Created in 15:01 2025/9/26
 * @description: 鉴权模块基础异常类
 */
public class AuthBaseException extends RuntimeException implements Serializable {

    @Serial
    private static final long serialVersionUID = 6884188987528822364L;

    /**
     * 错误码，用于前端／调用方区分不同业务错误。
     */
    private final String errorCode;

    /**
     * 构造：无错误码，仅消息
     *
     * @param message 异常消息
     */
    public AuthBaseException(String message) {
        super(message);
        this.errorCode = null;
    }

    /**
     * 构造：带消息 + 原因（cause）
     *
     * @param message 异常消息
     * @param cause   原始异常
     */
    public AuthBaseException(String message, Throwable cause) {
        super(message, cause);
        this.errorCode = null;
    }

    /**
     * 构造：带错误码 + 消息
     *
     * @param errorCode 业务错误码
     * @param message   异常消息
     */
    public AuthBaseException(String errorCode, String message) {
        super(message);
        this.errorCode = errorCode;
    }

    /**
     * 构造：带错误码 + 消息 + 原因
     *
     * @param errorCode 业务错误码
     * @param message   异常消息
     * @param cause     原始异常
     */
    public AuthBaseException(String errorCode, String message, Throwable cause) {
        super(message, cause);
        this.errorCode = errorCode;
    }

    /**
     * 如果只提供了 cause 且没有消息或错误码
     *
     * @param cause 原始异常
     */
    public AuthBaseException(Throwable cause) {
        super(cause);
        this.errorCode = null;
    }

    /**
     * 获取错误码
     *
     * @return 错误码，可能为 null
     */
    public String getErrorCode() {
        return errorCode;
    }

    @Override
    public String toString() {
        return "AuthBaseException{" +
                "errorCode='" + errorCode + '\'' +
                ", message='" + getMessage() + '\'' +
                (getCause() != null ? ", cause=" + getCause().toString() : "") +
                '}';
    }
}
